package com.study.cron;

import lombok.extern.slf4j.Slf4j;
import org.joda.time.DateTime;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author study
 * @version 1.0
 * @date 2020/8/16 21:45
 */

/**
 * 定时任务
 * 1 EnableScheduling 开启定时任务
 * 2 Scheduled开启一个定时任务
 * 3 自动配置TaskSchedulingAutoConfiguration
 * <p>
 * <p>
 * 异步任务|https://fookwood.com/spring-boot-tutorial-21-executor|https://www.cnblogs.com/lasdaybg/p/10161249.html
 * 1 EnableAsync 开启异步任务功能
 * 2 Async 给希望异步执行的方法上标注
 * 3 自动配置，TaskExecutionAutoConfiguration 绑定TaskExecutionProperties
 * 有以下几个配置
 * spring.task.scheduling.pool.size=5
 * spring.task.execution.pool.max-size=20
 * spring.task.execution.pool.core-size=8
 * spring.task.execution.thread-name-prefix=sync_
 * spring.task.execution.pool.queue-capacity=100
 * spring.task.execution.pool.keep-alive=10s
 */
@Slf4j
@Component
@EnableAsync
@EnableScheduling
public class CronDemo {
    /**
     * 1 spring中6位组成不允许第7位的年
     * 2 在周几的位置，1-7代表周一-周日，
     * 3 定时任务不应该阻塞，默认是阻塞的、
     * 使用异步+定时任务来完成任务不阻塞的功能
     */
    @Async
    @Scheduled(cron = "*/5 * * ? * 7")
    public void hello() {
        log.info("hello……" + new DateTime().toString("yyyy-MM-dd HH:mm:SS"));
        try {
            TimeUnit.SECONDS.sleep(9);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
